const db = require("../models"); // 确保 models/index.js 导出了 Op

class MessageRepositories {
  /* 新增站内信 */
  async addNewMsg(msg) {
    try {
      const newMsg = await db.Message.create(msg);
      return newMsg;
    } catch (e) {
      console.error(`新增站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 根据 id 删除 站内信 */
  async delMsgById(id) {
    try {
      const msg = await db.Message.findByPk(id);
      if (msg) {
        await msg.destroy();
        return true;
      }
      return false;
    } catch (e) {
      console.error(`删除站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 获取全部站内信（带分页和过滤） */
  async getAllMsgs(offset, limit, filters) {
    try {
      console.log("Filters in getAllMsgs:", filters); // 调试日志

      // 确保 filters.title 是字符串，并处理空值
      const safeFilters = {
        title: filters.title ? filters.title.toString().trim() : undefined,
        sendId: filters.sendId ? parseInt(filters.sendId) : undefined,
        acceptId: filters.acceptId ? parseInt(filters.acceptId) : undefined,
        isRead: filters.isRead ? filters.isRead.toLowerCase() : undefined,
        isSystem: filters.isSystem ? filters.isSystem.toLowerCase() : undefined,
      };

      return await db.Message.findAll({
        offset,
        limit,
        where: {
          ...(safeFilters.title && {
            title: { [db.Op.like]: `%${safeFilters.title}%` },
          }),
          ...(safeFilters.sendId && { sendId: safeFilters.sendId }),
          ...(safeFilters.acceptId && { acceptId: safeFilters.acceptId }),
          ...(safeFilters.isRead && { isRead: safeFilters.isRead }),
          ...(safeFilters.isSystem && { isSystem: safeFilters.isSystem }),
        },
        order: [["createdAt", "DESC"]], // 按创建时间降序排序
      });
    } catch (e) {
      console.error(`获取全部站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 获取消息总数，用于分页 */
  async countMessages(filters) {
    try {
      console.log("Filters in countMessages:", filters); // 调试日志

      // 确保 filters.title 是字符串，并处理空值
      const safeFilters = {
        title: filters.title ? filters.title.toString().trim() : undefined,
        sendId: filters.sendId ? parseInt(filters.sendId) : undefined,
        acceptId: filters.acceptId ? parseInt(filters.acceptId) : undefined,
        isRead: filters.isRead ? filters.isRead.toLowerCase() : undefined,
        isSystem: filters.isSystem ? filters.isSystem.toLowerCase() : undefined,
      };

      return await db.Message.count({
        where: {
          ...(safeFilters.title && {
            title: { [db.Op.like]: `%${safeFilters.title}%` },
          }),
          ...(safeFilters.sendId && { sendId: safeFilters.sendId }),
          ...(safeFilters.acceptId && { acceptId: safeFilters.acceptId }),
          ...(safeFilters.isRead && { isRead: safeFilters.isRead }),
          ...(safeFilters.isSystem && { isSystem: safeFilters.isSystem }),
        },
      });
    } catch (e) {
      console.error(`统计消息总数出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 根据 发送人ID sendId 查找站内信 */
  async getMsgBySendId(sendId, isRead = null) {
    try {
      const where = { sendId: parseInt(sendId) };
      if (isRead !== null) {
        where.isRead = isRead.toLowerCase(); // 规范化 isRead
      }
      return await db.Message.findAll({ where });
    } catch (e) {
      console.error(`根据发送人ID查找站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 根据 接收人ID acceptId 查找站内信 */
  async getMsgByAcceptId(acceptId, isRead = null) {
    try {
      const where = { acceptId: parseInt(acceptId) };
      if (isRead !== null) {
        where.isRead = isRead.toLowerCase(); // 规范化 isRead
      }
      return await db.Message.findAll({ where });
    } catch (e) {
      console.error(`根据接收人ID查找站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 根据ID设置站内信为已读状态 (设置 isRead 字段值为 yes) */
  async setMsgAsReadById(id) {
    try {
      const msg = await db.Message.findByPk(id);
      if (msg) {
        msg.isRead = "yes";
        await msg.save();
        return true;
      }
      return false;
    } catch (e) {
      console.error(`设置站内信为已读出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /* 获取来自于系统的站内信 (isSystem字段值为 yes 的) */
  async getSystemMsgs() {
    try {
      return await db.Message.findAll({
        where: {
          isSystem: "yes",
        },
      });
    } catch (e) {
      console.error(`获取系统站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }

  /**
   * 根据 ID 更新站内信
   * @param {number} id - 消息 ID
   * @param {Object} msgData - 更新数据
   * @returns {Promise<boolean>} - 返回更新是否成功
   */
  async updateMsgById(id, msgData) {
    try {
      const [updated] = await db.Message.update(msgData, {
        where: { id },
      });
      return updated > 0; // 如果有行被更新返回 true
    } catch (e) {
      console.error(`更新站内信出错: ${e}`);
      throw e; // 抛出错误，以便服务层处理
    }
  }
}

module.exports = new MessageRepositories();
